home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / getservent.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-18  |  2.0 KB  |  132 lines

  1. /*    getservent.c    4.5    83/01/02    */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netdb.h>
  7. #include <ctype.h>
  8. # include    <sccs.h>
  9.  
  10. SCCSID(@(#)getservent.c    8.1    12/31/84)
  11.  
  12. #define    MAXALIASES    35
  13.  
  14. static char SERVDB[] = "/etc/services";
  15. static FILE *servf = NULL;
  16. static char line[BUFSIZ+1];
  17. static struct servent serv;
  18. static char *serv_aliases[MAXALIASES];
  19. static int stayopen = 0;
  20. static char *any();
  21. static int myatoi();
  22.  
  23. setservent(f)
  24.     int f;
  25. {
  26.     if (servf == NULL)
  27.         servf = fopen(SERVDB, "r" );
  28.     else
  29.         rewind(servf);
  30.     stayopen |= f;
  31. }
  32.  
  33. endservent()
  34. {
  35.     if (servf && !stayopen) {
  36.         fclose(servf);
  37.         servf = NULL;
  38.     }
  39. }
  40.  
  41. struct servent *
  42. getservent()
  43. {
  44.     char *p;
  45.     register char *cp, **q;
  46.  
  47.  
  48.     if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL)
  49.         return (NULL);
  50. again:
  51.     if ((p = fgets(line, BUFSIZ, servf)) == NULL)
  52.         return (NULL);
  53.     if (*p == '#')
  54.         goto again;
  55.     cp = any(p, "#\n");
  56.     if (cp == NULL)
  57.         goto again;
  58.     *cp = '\0';
  59.     serv.s_name = p;
  60.     p = any(p, " \t");
  61.     if (p == NULL)
  62.         goto again;
  63.     *p++ = '\0';
  64.     while (*p == ' ' || *p == '\t')
  65.         p++;
  66.     cp = any(p, ",/");
  67.     if (cp == NULL)
  68.         goto again;
  69.     *cp++ = '\0';
  70.     serv.s_port = htons((u_short)myatoi(p));
  71.     serv.s_proto = cp;
  72.     q = serv.s_aliases = serv_aliases;
  73.     cp = any(cp, " \t");
  74.     if (cp != NULL)
  75.         *cp++ = '\0';
  76.     while (cp && *cp) {
  77.         if (*cp == ' ' || *cp == '\t') {
  78.             cp++;
  79.             continue;
  80.         }
  81.         if (q < &serv_aliases[MAXALIASES - 1])
  82.             *q++ = cp;
  83.         cp = any(cp, " \t");
  84.         if (cp != NULL)
  85.             *cp++ = '\0';
  86.     }
  87.     *q = NULL;
  88.     return (&serv);
  89. }
  90.  
  91. static char *
  92. any(cp, match)
  93.     register char *cp;
  94.     char *match;
  95. {
  96.     register char *mp, c;
  97.  
  98.     while (c = *cp) {
  99.         for (mp = match; *mp; mp++)
  100.             if (*mp == c)
  101.                 return (cp);
  102.         cp++;
  103.     }
  104.     return ((char *)0);
  105. }
  106.  
  107. static int
  108. myatoi(p)
  109. register char *p;
  110. {
  111.     register int n;
  112.     register int f;
  113.  
  114.     n = 0;
  115.     f = 0;
  116.     for(;;p++) {
  117.         switch(*p) {
  118.         case ' ':
  119.         case '\t':
  120.             continue;
  121.         case '-':
  122.             f++;
  123.         case '+':
  124.             p++;
  125.         }
  126.         break;
  127.     }
  128.     while(*p >= '0' && *p <= '9')
  129.         n = n*10 + *p++ - '0';
  130.     return(f? -n: n);
  131. }
  132.